package net.siufung.security.base.service;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import net.siufung.core.model.consts.Constants;
import net.siufung.security.base.CurrentUser;
import net.siufung.security.base.CurrentUserGroup;
import net.siufung.security.base.enums.TokenGranters;
import net.siufung.security.base.utils.PasswordUtil;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.List;

/**
 * @author 陈建峰
 * @since 2022/3/2 11:24 上午
 */
public interface ICurrentUserService {

    /**
     * 通过登录名获取当前用户
     * @param loginName 登录名称
     * @param tenantId 租户Id
     * @return 当前用户会话信息
     */
    CurrentUser getUserByLoginName(String loginName, String tenantId);

    /**
     * 默认用户密码加密方式
     * @return PasswordEncoder
     */
    default PasswordEncoder getUserPasswordEncoder(){
        return PasswordUtil.get();
    };

    /**
     * 获取用户信息通过有效令牌
     * @param token 有效令牌
     * @return JSONObject
     */
    default CurrentUser getUserByValidToken(String token) {
        JSONObject jsonObject = JSONObject.parseObject(token);
        JSONObject contextUser = jsonObject.getJSONObject(Constants.AUTH_CONTEXT_USER_KEY);
        return new CurrentUser(
                contextUser.getString("username"),
                "",
                contextUser.getBoolean("enabled"),
                true,
                true,
                true,
                Lists.newArrayList(),
                contextUser.getString("id"),
                contextUser.getString("name"),
                contextUser.getString("phone"),
                new CurrentUserGroup(
                    contextUser.getString("deptId"),
                    contextUser.getString("tenantId")
                ),
                contextUser.getBoolean("adminState"),
                contextUser.getBoolean("initState"),
                contextUser.getJSONObject("extra")
        );
    }

    /**
     * 获取当前用户权限标识集合
     * @param loginName 登录名
     * @return 用户权限标识集合
     */
    default List<String> getAuthorities(String loginName){
        return Lists.newArrayList();
    };

    /**
     * 获取当前用户权限标识集合
     * @return 用户权限标识集合
     */
    default List<String> getAuthorities(){
        return Lists.newArrayList();
    };

    /**
     * 获取当前用户角色集合
     * @return 用户角色集合
     */
    default List<String> getRoleList() {return Lists.newArrayList(); };

    /**
     * 更新登录信息
     * @param loginName 登录名
     * @param tokenGranters 登录方式
     * @param parameters 登录参数
     */
    default void updateLoginInfo(String loginName, TokenGranters tokenGranters, String parameters){};

}
